package dao;

import java.nio.charset.Charset;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import beans.Cliente;
import beans.Usuario;


public class MysqlDao implements ClienteDao {
	
	private static MysqlDao instance;
	private String url = "jdbc:mysql://localhost/positivo";
	private String user = "admin";
	private String senha = "faculdade";
	private String clazzForName = "com.mysql.jdbc.Driver";
	
	
//	private String url = "jdbc:sqlserver://localhost:1433; databaseName=positivo";
//	private String user = "sa";
//	private String senha = "mhcdx9";
//	private String clazzForName = "com.microsoft.sqlserver.jdbc.SQLServerDriver";

	public MysqlDao() {

	}
	
	public MysqlDao getInstance() {
		if (instance == null)
			instance = new MysqlDao();

		return instance;
	}
	
	
	@Override
	public int cadastrarCliente(Cliente cliente) {		
		int retorno = 0;
		try{			
			Class.forName(clazzForName);			
			Connection conn = DriverManager.getConnection(url,user,senha);			
			String sql = " INSERT INTO clientes "
					+ " (                                     "
					+ " email,                            "					
					+ " nome,                               "
					+ " endereco,                           "
					+ " cidade,                             "
					+ " estado,                             "
					+ " cep)                                "
					+ " VALUES                                "
					+ " (?,"
					+ "?,"
					+ "?,"
					+ "?,"
					+ "?,"
					+ "?); 					  ";			
			PreparedStatement st = conn.prepareStatement(sql);
			
			byte bts[] = cliente.getNome().getBytes();
			String nome = new String(bts, Charset.forName("UTF-8"));
			
			st.setString(1,cliente.getEmail());
			st.setString(2, nome);
			st.setString(3, cliente.getEndereco());
			st.setString(4, cliente.getCidade());
			st.setString(5, cliente.getEstado());
			st.setString(6, cliente.getCep());
			retorno = st.executeUpdate();	
			
		}catch(SQLException ex){
			System.out.println(ex.getMessage());
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
		}
		return retorno;
		
		
	}

	public boolean alterarCliente(Cliente cliente) {
		
		boolean retorno = false;
		try{
			
			Class.forName(clazzForName);
			
			Connection conn = DriverManager.getConnection(url,user,senha);
			
			String sql = "update  clientes set" +
						" 	   nome = ?, " +
						" 	   endereco = ?, " +
						" 		cidade = ?, " +
						" 		estado = ?, " +
						" 		email = ?, " +
						" 		cep = ? " +
						" where id = ? "; 
			
			PreparedStatement st = conn.prepareStatement(sql);
			st.setString(1, cliente.getNome());
			st.setString(2, cliente.getEndereco());
			st.setString(3, cliente.getCidade());
			st.setString(4, cliente.getEstado());
			st.setString(5, cliente.getEmail());
			st.setString(6, cliente.getCep());
			st.setLong(7, cliente.getId());
			retorno = st.executeUpdate() > 0;
			
		}catch(SQLException ex){
			System.out.println(ex.getMessage());
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
		}
		return retorno;
		
		
	}

	
	
	@Override
	public ArrayList<Cliente> getClientes() throws ClassNotFoundException {

		ArrayList<Cliente> retorno = new ArrayList<Cliente>();

		try {
			Class.forName(clazzForName);
			
			Connection conn = DriverManager.getConnection(url, user,senha);
			
			String sql = " select *  " +
						" from clientes " ;

			PreparedStatement pstmt = conn.prepareStatement(sql);
			
			ResultSet rs = pstmt.executeQuery();
			
			while (rs.next()) {

				Cliente cliente = new Cliente(rs.getInt("id"), rs.getString("nome"), rs.getString("endereco"), rs.getString("cidade"), rs.getString("estado"), rs.getString("cep"), rs.getString("email"));
				
				retorno.add(cliente);

				
			}
			pstmt.close();
			rs.close();
			conn.close();

		} catch (SQLException sqlException) {
			System.out.println("Erro na instrução SQL " + sqlException);
		} catch (OutOfMemoryError outOfMemoryError) {
			System.out.println("Falta de memória " + outOfMemoryError);
		}

		return retorno;

	
	
	}
	
	@Override
	public boolean excluirCliente(Cliente cliente) {
		
		boolean retorno = false;
		try{
			
			Class.forName(clazzForName);
			
			Connection conn = DriverManager.getConnection(url,user,senha);
			
			String sql = "delete from clientes " +
						" where id = ? "; 
			
			PreparedStatement st = conn.prepareStatement(sql);
			st.setLong(1, cliente.getId());
			retorno = st.executeUpdate() > 0;
			
		}catch(SQLException ex){
			System.out.println(ex.getMessage());
		}catch(ClassNotFoundException ex){
			System.out.println(ex.getMessage());
		}
		return retorno;
		
		
	}

	@Override
	public boolean login(Usuario usuario) {
		boolean login = false;
		try {
			Class.forName(clazzForName);
			
			Connection conn = DriverManager.getConnection(url, user,senha);
			
			String sql = " select *  " +
						" from usuarios " ;

			PreparedStatement pstmt = conn.prepareStatement(sql);
			
			ResultSet rs = pstmt.executeQuery();
			
			while (rs.next()) {
				if(rs.getString("usuario").equals(usuario.getUsuario())){
					if(rs.getString("senha").equals(usuario.getSenha())){
						login = true;
					}
					break;
				}								
			}
			pstmt.close();
			rs.close();
			conn.close();

		} catch (SQLException sqlException) {
			System.out.println("Erro na instrução SQL " + sqlException);
		} catch (OutOfMemoryError outOfMemoryError) {
			System.out.println("Falta de memória " + outOfMemoryError);
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return login;
	}

	
}
